/* 对axios二次封装 */
/* axios二次封装：请求拦截器，响应拦截器，可以在发请求之前处理一些业务逻辑，响应拦截器，当服务器数据返回后可以处理一些事情 */

import axios from 'axios'

/* 引入进度条插件 */
import nProgress from 'nprogress';
/* nProgress的start:进度条开始  done：进度条结束 */

/* 引入进度条的样式 */
import "nprogress/nprogress.css"

/* 在当前模块引入store */
import store from "@/store"



/* 1.利用axios对象的方法 create 创建axios实例  requests就是axios 可以稍微配置一下 */
const requests = axios.create({
    /* 配置对象 发送请求的时候，基础路径，当路径出现有/api 默认可以省略 (重点) */
    baseURL: '/api',
    /* 代表请求超时的时间5s 当5s之后就当作请求失败 */
    timeout: 5000,

});


/* 请求拦截器,再发请求之前 请求拦截器可以检测到，可以在请求发出去之前做一些事情 */
requests.interceptors.request.use((config) => {
    /*捕获到请求 进度条开始动 */
    nProgress.start()
    if(store.state.detail.uuid_token){
        /* 给请求头添加一个字段(userTemId) 跟后端商量 */
        config.headers.userTempId=store.state.detail.uuid_token
    }
    /* 判断是否需要携带token带给服务器 */
    if(store.state.user.token){
        config.headers.token=store.state.user.token
    }
    /* config是个配置对象 对象里面有一个属性很重要 header请求头 */
    return config
})

/* 响应拦截器 里面含有成功的回调和失败的回调 */
requests.interceptors.response.use((res) => {
    /* 得到成功的回调后进度条结束 */
    nProgress.done()
    /* 服务器相应成功的回调函数：服务器响应数据回来以后，相应拦截器可以监测到，可以做一些事情 */
    return res.data
}, (error) => {
    /* 服务器响应失败的回调函数 */
    return Promise.reject(new Error('faile'))
})



/* 对外暴露 */
export default requests